{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from Util import gen_five_clusters, visualize2d\n",
    "\n",
    "class NN:\n",
    "    def __init__(self, ws=None):\n",
    "        self._ws = ws\n",
    "        self._n_hiddens = []\n",
    "        self._funcs, self._loss_func = [], None\n",
    "    \n",
    "    @staticmethod\n",
    "    def relu(x, diff):\n",
    "        if diff:\n",
    "            return x != 0\n",
    "        return np.maximum(0, x)\n",
    "    \n",
    "    @staticmethod\n",
    "    def sigmoid(x, diff):\n",
    "        if diff:\n",
    "            return x * (1 - x)\n",
    "        return 1 / (1 + np.exp(-x))\n",
    "    \n",
    "    @staticmethod\n",
    "    def tanh(x, diff):\n",
    "        if diff:\n",
    "            return (1 - x) * (1 + x)\n",
    "        return np.tanh(x)\n",
    "    \n",
    "    @staticmethod\n",
    "    def identical(x, diff=False):\n",
    "        return x\n",
    "    \n",
    "    @staticmethod\n",
    "    def cross_entropy_with_softmax(y_pred, y_true, diff):\n",
    "        if diff:\n",
    "            return y_pred - y_true\n",
    "        exp_pred = np.exp(y_pred - np.max(y_pred, axis=1, keepdims=True))\n",
    "        exp_pred /= np.sum(exp_pred, axis=1, keepdims=True)\n",
    "        return -np.average(\n",
    "            y_true * np.log(np.maximum(y_pred, 1e-12)) +\n",
    "            (1 - y_true) * np.log(np.maximum(1 - y_pred, 1e-12))\n",
    "        )\n",
    "    \n",
    "    def add(self, func, n_hidden):\n",
    "        self._funcs.append(func.lower())\n",
    "        self._n_hiddens.append(n_hidden)\n",
    "        \n",
    "    def add_loss(self, loss_func):\n",
    "        self._funcs.append(\"identical\")\n",
    "        self._loss_func = loss_func.lower()\n",
    "    \n",
    "    def fit(self, x, y, lr=1e-3, epoch=1000):\n",
    "        input_dim, output_dim = x.shape[1], y.shape[1]\n",
    "        losses = []\n",
    "        self._loss_func = getattr(self, self._loss_func)\n",
    "        self._funcs = [getattr(self, func) for func in self._funcs]\n",
    "        self._init_weights(x.shape[1], y.shape[1])\n",
    "        for _ in range(epoch):\n",
    "            # 计算各层的激活值\n",
    "            activations = self._get_activations(x)\n",
    "            # 计算各层的局部梯度\n",
    "            deltas = [self._loss_func(activations[-1], y, True)]\n",
    "            for i in range(-1, -len(activations), -1):\n",
    "                deltas.append(\n",
    "                    deltas[-1].dot(self._ws[i].T) * \n",
    "                    self._funcs[i - 1](activations[i - 1], True)\n",
    "                )\n",
    "            # 根据激活值与局部梯度来更新参数\n",
    "            for i in range(len(activations) - 1, 0, -1):\n",
    "                self._opt(i, activations[i - 1], deltas[len(activations) - i - 1], lr)\n",
    "            self._opt(0, x, deltas[-1], lr)\n",
    "            # 记录损失\n",
    "            losses.append(self._loss_func(activations[-1], y, False))\n",
    "        return losses\n",
    "    \n",
    "    def _init_weights(self, input_dim, output_dim):\n",
    "        if self._ws is not None:\n",
    "            return\n",
    "        self._ws = []\n",
    "        current_dim = input_dim\n",
    "        for n_hidden in self._n_hiddens:\n",
    "            self._ws.append(np.random.randn(current_dim, n_hidden))\n",
    "            current_dim = n_hidden\n",
    "        self._ws.append(np.random.randn(current_dim, output_dim))\n",
    "    \n",
    "    def _get_activations(self, x):\n",
    "        activations = [self._funcs[0](x.dot(self._ws[0]), False)]\n",
    "        for i, func in enumerate(self._funcs[1:]):\n",
    "            activations.append(func(\n",
    "                activations[-1].dot(self._ws[i + 1]), False\n",
    "            ))\n",
    "        return activations\n",
    "    \n",
    "    def _opt(self, i, activation, delta, lr):\n",
    "        # 采用朴素的梯度下降法进行训练\n",
    "        self._ws[i] -= lr * activation.T.dot(delta)\n",
    "    \n",
    "    def predict(self, x):\n",
    "        return np.argmax(self._get_activations(x)[-1], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x201c99f33c8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准确率：    97.0 %\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x201cc0b4dd8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x, y = gen_five_clusters()\n",
    "label = np.argmax(y, axis=1)\n",
    "\n",
    "nn = NN()\n",
    "nn.add(\"Sigmoid\", 64)\n",
    "nn.add(\"Sigmoid\", 64)\n",
    "nn.add(\"Sigmoid\", 64)\n",
    "nn.add(\"Sigmoid\", 64)\n",
    "nn.add_loss(\"cross_entropy_with_softmax\")\n",
    "\n",
    "losses = nn.fit(x, y, 1e-4)\n",
    "visualize2d(nn, x, label, padding=0.2, draw_background=True)\n",
    "print(\"准确率：{:8.6} %\".format((nn.predict(x) == label).mean() * 100))\n",
    "\n",
    "plt.figure()\n",
    "plt.plot(np.arange(1, len(losses)+1), losses)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
